/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.chain.presenter;

import br.com.model.Token;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTree;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

/**
 *
 * @author Bush
 */
public class ArvoreDeSimbolos {

    private ArrayList<Token> tabelaDeSimbolosSaida;
    private ArrayList<String> palavrasTab;
    private ArrayList<String> palavrasMenosTab;

    public ArvoreDeSimbolos() {
        tabelaDeSimbolosSaida = new ArrayList<>();
        inicializaTabelaSibolos();
        palavrasMenosTab = new ArrayList<String>();
        palavrasTab = new ArrayList<String>();

        palavrasTab.add("var");
        palavrasTab.add("const");
        palavrasTab.add("procedure");
        palavrasTab.add("function");
        palavrasTab.add("if");
        palavrasTab.add("while");
        palavrasTab.add("repeat");
        palavrasTab.add("else");
        palavrasTab.add("begin");

        // palavrasMenosTab.add(";");
        palavrasMenosTab.add("end");
    }

    public DefaultTreeModel setArvoreDeSimbolos() {
        DefaultMutableTreeNode master = new DefaultMutableTreeNode("Pascal Ufes");
        DefaultTreeModel model = new DefaultTreeModel(master);
        listAllFiles2(tabelaDeSimbolosSaida, master, false);
        return model;
    }
    
    private void listAllFiles2(ArrayList<Token> children, DefaultMutableTreeNode parent, boolean flag) {

        for (int i = 0; i < children.size();) {
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(children.get(i).getLexema());
            
            if (node.getUserObject().equals(",")) {
                children.remove(i);
                continue;
            }
            if (palavrasTab.contains(children.get(i).getLexema().toLowerCase())) {
                parent.add(node);
                children.remove(i);
                listAllFiles(children, node, true);
                continue;
            } else if (children.get(i).getLexema().toLowerCase().equals(";") && flag == false) {
                parent.add(node);
                children.remove(i);
                continue;
            } else if(children.get(i).getLexema().toLowerCase().equals(";") && flag == true){
                parent.add(node);
                children.remove(i);
                break;
            }else if (palavrasMenosTab.contains(children.get(i).getLexema().toLowerCase()) && flag == true) {
                parent.add(node);
                children.remove(i);
                break;
            }
            parent.add(node);
            children.remove(i);
        }
    }

    private void listAllFiles(ArrayList<Token> children, DefaultMutableTreeNode parent, boolean flag) {

        for (int i = 0; i < children.size();) {
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(children.get(i).getLexema());
            
            if (node.getUserObject().equals(",")) {
                children.remove(i);
                continue;
            }
            if (palavrasTab.contains(children.get(i).getLexema().toLowerCase())) {
                parent.add(node);
                children.remove(i);
                listAllFiles(children, node, true);
                continue;
            } else if (children.get(i).getLexema().toLowerCase().equals(";") && flag == false) {
                parent.add(node);
                children.remove(i);
                continue;
            } else if(children.get(i).getLexema().toLowerCase().equals(";") && flag == true){
                parent.add(node);
                children.remove(i);
                break;
            }else if (palavrasMenosTab.contains(children.get(i).getLexema().toLowerCase()) && flag == true) {
                parent.add(node);
                children.remove(i);
                break;
            }
            parent.add(node);
            children.remove(i);
        }
    }

    private void inicializaTabelaSibolos() {
        ArrayList<Token> tabela = AnalisadorLexico.getInstancia().getTabelaDeSibolos();
        for (int i = 0; i < tabela.size(); i++) {
            tabelaDeSimbolosSaida.add(tabela.get(i));
        }
    }
    
    


//    public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
//        // Lista todos os arquivos no diretório "String directory" no array "children"  
//        File[] children = new File(directory).listFiles();
//
//        for (int i = 0; i < children.length; i++) {
//
//            // Pega o nome de cada Pasta ou Arquivo  
//            DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
//            // Só mostra o Node se ele é uma pasta e se esta é uma chamada recursiva  
//            if (children[i].isDirectory() && recursive) {
//                parent.add(node); // adiciona como filho  
//                listAllFiles(children[i].getPath(), node, recursive); // chamada recursiva para trabalhar com o filho  
//            } else if (!children[i].isDirectory()) { // senão caso não seja um diretório  
//                parent.add(node); // adiciona como um arquivo  
//            }
//        }
//    }
}
